home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1122 / 1122.xpi / chrome / tabmixplus.jar / content / tabmixplus / places / places.js < prev    next >
Text File  |  2009-10-07  |  20KB  |  464 lines

  1. // code by onemen
  2. const prefStringTMHistory = "extensions.tabmix.opentabfor.history";
  3. const prefStringTMUseMiddleClick = "extensions.tabmix.middlecurrent";
  4. const prefStringTMBookmark = "extensions.tabmix.opentabfor.bookmarks";
  5.  
  6. var TMP_Places = {
  7.    init : function TMP_PC_init() {
  8.       if (!("tmLog" in window))
  9.         window.tmLog = function(a,b) { window.setTimeout(function (a1,b1) { getTopWin().tmLog(a1,b1);}, 100, a, b);}
  10.  
  11.       var treeStyleTab = "TreeStyleTabBookmarksService" in window;
  12.       if (treeStyleTab) {
  13.         // To TreeStyleTab extension developre contact me at onemen.one@gmail.com
  14.         function delayEval() {
  15.           eval("PlacesUIUtils._openTabset ="+PlacesUIUtils._openTabset.toString().replace(
  16.             'urls = []',
  17.             'behavior, $&'
  18.           ).replace(          
  19.             'window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", urls.join("|"));',
  20.             'var newWin = $& \
  21.              newWin.bookMarkIds = ids.join("|");'
  22.           ).replace(
  23.             'let openGroupBookmarkBehavior =',
  24.             '$& behavior ='
  25.           ).replace(
  26.             /browserWindow\.(gBrowser|getBrowser\(\))\.loadTabs\(urls, loadInBackground, replaceCurrentTab\);/,
  27.             'var changeWhere = where == "tabshifted" && aEvent.target.localName != "menuitem"; \
  28.              if (changeWhere) where = "current"; \
  29.              browserWindow.TMP_Places.openGroup(urls, ids, where, behavior);'
  30.           ));
  31.         }
  32.         window.setTimeout(delayEval, 0);
  33.       }
  34.       else { // TreeStyleTab not installed
  35.         eval("PlacesUIUtils._openTabset ="+PlacesUIUtils._openTabset.toString().replace(
  36.           'var urls = [];',
  37.           '$& var ids = [];'
  38.         ).replace(
  39.           'urls.push(item.uri);',
  40.           '$& ids.push(item.id);'
  41.         ).replace(
  42.          'window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", urls.join("|"));',
  43.          'var newWin = $& \
  44.           newWin.bookMarkIds = ids.join("|");'
  45.         ).replace(
  46.           /browserWindow\.(gBrowser|getBrowser\(\))\.loadTabs\(urls, loadInBackground, replaceCurrentTab\);/,
  47.           'var changeWhere = where == "tabshifted" && aEvent.target.localName != "menuitem"; \
  48.            if (changeWhere) where = "current"; \
  49.            browserWindow.TMP_Places.openGroup(urls, ids, where);'
  50.         ));
  51.  
  52.         eval("PlacesUIUtils.openURINodesInTabs ="+PlacesUIUtils.openURINodesInTabs.toString().replace(
  53.           'uri: aNodes[i].uri,',
  54.           'id: aNodes[i].itemId, $&'
  55.         ));
  56.  
  57.         // we need to run this only one time
  58.         var _getURLsForContainerNode = PlacesUtils.getURLsForContainerNode.toString();
  59.         if (_getURLsForContainerNode.indexOf("child.itemId") == -1) {
  60.           eval("PlacesUtils.getURLsForContainerNode ="+_getURLsForContainerNode.toString().replace(
  61.             'uri: child.uri,',
  62.             'id:  child.itemId, $&'
  63.           ));
  64.         }
  65.       }
  66.  
  67.       PlacesController.prototype.beforeTabMixPLusBuildContextMenu = PlacesController.prototype.buildContextMenu;
  68.       PlacesController.prototype.buildContextMenu = function(aPopup) {
  69.          var anyVisible = this.beforeTabMixPLusBuildContextMenu(aPopup);
  70.          if (anyVisible)
  71.             TMP_Places.buildContextMenu();
  72.  
  73.          return(anyVisible);
  74.       }
  75.  
  76.       eval("PlacesUIUtils.openNodeWithEvent ="+PlacesUIUtils.openNodeWithEvent.toString().replace(
  77.          'this.openNodeIn(aNode, whereToOpenLink(aEvent));',
  78.          'this.openNodeIn(aNode, whereToOpenLink(aEvent), aEvent);'
  79.       ));
  80.  
  81.       // Don't change "current" when user click context menu open (callee is PC_doCommand and aWhere is current)
  82.       // we disable the open menu when the tab is lock
  83.       eval("PlacesUIUtils.openNodeIn ="+PlacesUIUtils.openNodeIn.toString().replace(
  84.          'openUILinkIn(aNode.uri, aWhere);',
  85.          'if (arguments.length == 3) \
  86.              aWhere = TMP_Places.isBookmarklet(aNode.uri) ? "current" : TMP_Places.fixWhereToOpen(arguments[2], aWhere); \
  87.           else if (aWhere == "current" && arguments.callee.caller.name != "PC_doCommand" && !TMP_Places.isBookmarklet(aNode.uri)) \
  88.              aWhere = TMP_Places.fixWhereToOpen(null, aWhere); \
  89.           openUILinkIn(aNode.uri, aWhere, null, null, null, {bookMarkId: aNode.itemId});'
  90.       ));
  91.  
  92.       // use tab label for bookmark name when user renamed the tab
  93.       // PlacesCommandHook exist on browser window
  94.       if ("PlacesCommandHook" in window) {
  95.          eval("PlacesCommandHook.bookmarkPage ="+PlacesCommandHook.bookmarkPage.toString().replace(
  96.             'title = webNav.document.title || url.spec;',
  97.             'title = TMP_Places.getTabFixedTitle(aBrowser, url) || webNav.document.title || url.spec;'
  98.          ));
  99.  
  100.          eval("PlacesCommandHook._getUniqueTabInfo ="+PlacesCommandHook._getUniqueTabInfo.toString().replace(
  101.             'tabList.push(uri);',
  102.             'tabList.push({uri: uri, title: TMP_Places.getTabFixedTitle(browsers[i], uri)});'
  103.          ).replace(
  104.             'seenURIs.uri.spec = true;',
  105.             'seenURIs[uri.spec] = true;'
  106.          ));
  107.       }
  108.  
  109.       if ("BookmarksEventHandler" in window) {
  110.          eval("BookmarksEventHandler.onPopupShowing ="+BookmarksEventHandler.onPopupShowing.toString().replace(
  111.             "openUILink(this.getAttribute('siteURI'), event);",
  112.             "TMP_Places.openLivemarkSite(this.getAttribute('siteURI'), event);"
  113.          ));
  114.       }
  115.  
  116.       // fix small bug when the event is not mouse event
  117.       // inverse focus of middle/ctrl/meta clicked bookmarks/history
  118.       // when we are in single window mode set the function to retuen "tab"
  119.       eval("whereToOpenLink ="+whereToOpenLink.toString().replace(
  120.         'var middle = !ignoreButton && e.button == 1;',
  121.         'var middle = e instanceof MouseEvent && !ignoreButton && e.button == 1;'
  122.       ).replace(
  123.         'if (shift)',
  124.         'var inversefocus = getBoolPref("extensions.tabmix.inversefocusOther", true);\
  125.          if (inversefocus || (!inversefocus && shift))'
  126.       ).replace(
  127.         'return "window";',
  128.         'return getSingleWindowMode() ? "tab" : "window";'
  129.       ));
  130.  
  131.       eval("openUILinkIn ="+openUILinkIn.toString().replace(
  132.         '{',
  133.         '{ var bookMarkId, backgroundPref, tabmixArg = arguments.length > 5 ? arguments[5] : null; \
  134.          if (tabmixArg) { \
  135.            bookMarkId = "bookMarkId" in tabmixArg && tabmixArg.bookMarkId > -1 ? tabmixArg.bookMarkId : null; \
  136.            backgroundPref = "backgroundPref" in tabmixArg ? tabmixArg.backgroundPref : null; \
  137.          }'
  138.       ).replace(
  139.         'var w = getTopWin();',
  140.         '$& \
  141.          if (where == "window" && getSingleWindowMode()) where = "tab";'
  142.       ).replace(
  143.         'ww.openWindow(w || window, getBrowserURL(), null, "chrome,dialog=no,all", sa);',
  144.         'var newWin = ww.openWindow(w || window, getBrowserURL(), null, "chrome,dialog=no,all", sa); \
  145.          if (bookMarkId) newWin.bookMarkIds = bookMarkId;'
  146.       ).replace(
  147.         '"browser.tabs.loadBookmarksInBackground"',
  148.         'backgroundPref || $&'
  149.       ).replace(
  150.         'w.loadURI(url, referrerUrl, postData, allowThirdPartyFixup);',
  151.         '$& if (bookMarkId) w.gBrowser.mCurrentTab.setAttribute("tabmix_bookmarkId", bookMarkId);'
  152.       ).replace( // Firefox 3.0 - 3.6
  153.         'browser.loadOneTab(url, referrerUrl, null, postData, loadInBackground, allowThirdPartyFixup || false);',
  154.         '$& if (bookMarkId) browser.getTabForLastPanel().setAttribute("tabmix_bookmarkId", bookMarkId);'
  155.       ).replace( // firefox 3.7+
  156.         'browser.loadOneTab(url, {referrerURI: referrerUrl, postData: postData, inBackground: loadInBackground, allowThirdPartyFixup: allowThirdPartyFixup});',
  157.         '$& if (bookMarkId) browser.getTabForLastPanel().setAttribute("tabmix_bookmarkId", bookMarkId);'        
  158.       ));
  159.    },
  160.  
  161.    buildContextMenu : function TMP_PC_buildContextMenu() {
  162.       var _open = document.getElementById("placesContext_open");
  163.       var _openInWindow = document.getElementById("placesContext_open:newwindow");
  164.       var _openInTab = document.getElementById("placesContext_open:newtab");
  165.       TMP_updateContextMenu(_open, _openInWindow, _openInTab, this.getPrefByDocumentURI(window));
  166.    },
  167.  
  168.    historyMenuItemsTitle : function TMP_PC_historyMenuItemsTitle(aEvent) {
  169.       var aMenuPopup = aEvent.target;
  170.       if (aMenuPopup.id != "goPopup" || !gTabmixPrefs.getBoolPref("extensions.tabmix.titlefrombookmark"))
  171.          return;
  172.  
  173.       for (var i = 0; i < aMenuPopup.childNodes.length ; i++) {
  174.          if (aMenuPopup.childNodes[i].id == "startHistorySeparator")
  175.             break;
  176.       }
  177.       for (i++; i < aMenuPopup.childNodes.length ; i++) {
  178.          var item = aMenuPopup.childNodes[i];
  179.          if (item.id == "endHistorySeparator")
  180.             break;
  181.          var bookMarkName = getTitleFromBookmark(item.node.uri);
  182.          if (bookMarkName)
  183.             item.setAttribute("label", bookMarkName);
  184.       }
  185.    },
  186.  
  187.    // replace openlivemarksite-menuitem with tabmix function
  188.    openLivemarkSite : function TMP_PC_openLivemarkSite(aUrl, aEvent) {
  189.      var where = whereToOpenLink(aEvent);
  190.      var where = this.fixWhereToOpen(aEvent, whereToOpenLink(aEvent), prefStringTMBookmark);
  191.      openUILinkIn(aUrl, where);
  192.    },
  193.  
  194.    historyMenu : function TMP_PC_historyMenu(aEvent) {
  195.       var node = aEvent.target.node;
  196.       if (node) {
  197.          PlacesUIUtils.markPageAsTyped(node.uri);
  198.          var where = this.isBookmarklet(node.uri) ? "current" :
  199.                       this.fixWhereToOpen(aEvent, whereToOpenLink(aEvent, false, true), prefStringTMHistory);
  200.          openUILinkIn(node.uri, where);
  201.       }
  202.    },
  203.  
  204.    isBookmarklet : function (url) {
  205.       var jsURL = /^ *javascript:/;
  206.       return jsURL.test(url) ? true : false;
  207.    },
  208.  
  209.    fixWhereToOpen: function (aEvent, aWhere, aPref) {
  210.       var w = getTopWin();
  211.       if (!w)
  212.          return aWhere;
  213.  
  214.       var tabBrowser = w.gBrowser;
  215.       var aTab = tabBrowser.mCurrentTab;
  216.  
  217.       if (typeof(aPref) == "undefined")
  218.          aPref = this.getPrefByDocumentURI(window);
  219.  
  220.       var _pref = w.gTabmixPrefs;
  221.       if ((_pref.getBoolPref(aPref) || aTab.hasAttribute("locked")))
  222.          if (aEvent && _pref.getBoolPref(prefStringTMUseMiddleClick) &&
  223.                (aEvent.button == 1 || aEvent.button == 0 && (aEvent.ctrlKey || aEvent.metaKey)))
  224.             aWhere = "current";
  225.          else if (aWhere == "current" && !tabBrowser.isBlankNotBusyTab(aTab))
  226.             aWhere = "tab";
  227.  
  228.       return aWhere;
  229.    },
  230.  
  231.    getPrefByDocumentURI: function (aWindow) {
  232.      switch (aWindow.document.documentURI) {
  233.        case "chrome://browser/content/places/places.xul":
  234.          if (PlacesOrganizer._places.selectedNode.itemId != PlacesUIUtils.leftPaneQueries["History"])
  235.            break;
  236.        case "chrome://browser/content/history/history-panel.xul":
  237.          return prefStringTMHistory;
  238.        case "chrome://browser/content/browser.xul":
  239.        case "chrome://browser/content/bookmarks/bookmarksPanel.xul":
  240.        default:
  241.          break;
  242.      }
  243.      return prefStringTMBookmark;
  244.    },
  245.  
  246.   // fixed: reuse all blank tab not just in the end
  247.   // fixed: if "browser.tabs.loadFolderAndReplace" is true don't reuse locked and protected tabs open bookmark after those tabs
  248.   // fixed: focus the first tab if "extensions.tabmix.openTabNext" is true
  249.   // fixed: remove "selected" and "flst_id" from reuse tab
  250.   openGroup: function TMP_PC_openGroup(bmGroup, bmIds, aWhere) {
  251.     var tabBar = gBrowser.mTabContainer;
  252.     var tabs = tabBar.childNodes;
  253.  
  254.     var doReplace = (/^tab/).test(aWhere) ? false :
  255.                              gTabmixPrefs.getBoolPref("browser.tabs.loadFolderAndReplace");
  256.     var loadInBackground = bmGroup.length > 1 ? gTabmixPrefs.getBoolPref("extensions.tabmix.loadBookmarksGroupInBackground") :
  257.                                                  gTabmixPrefs.getBoolPref("browser.tabs.loadBookmarksInBackground");
  258.     var openTabNext = gTabmixPrefs.getBoolPref("extensions.tabmix.openTabNext");
  259.  
  260.     // catch tab for reuse
  261.     var aTab, reuseTabs = [], removeTabs = [], i;
  262.     var tabIsBlank, canReplace;
  263.     for (i = 0; i < tabs.length ; i++) {
  264.        aTab = tabs[i];
  265.        tabIsBlank = gBrowser.isBlankNotBusyTab(aTab);
  266.        // don't reuse collapsed tab if width fitTitle is set
  267.        canReplace = (doReplace && !aTab.hasAttribute("locked")) || tabIsBlank;
  268.        if (reuseTabs.length < bmGroup.length && canReplace)
  269.           reuseTabs.push(aTab);
  270.        else if ((doReplace && !aTab.hasAttribute("locked") && !aTab.hasAttribute("protected")) || tabIsBlank) {
  271.           aTab.collapsed = true;
  272.           removeTabs.push(aTab);
  273.        }
  274.     }
  275.  
  276.     var tabToSelect = null;
  277.     var prevTab = (!doReplace && openTabNext && gBrowser.mCurrentTab._tPos < tabs.length - 1) ? gBrowser.mCurrentTab : tabBar.lastChild;
  278.     var tabPos, index;
  279.     for (i = 0; i < bmGroup.length ; i++) {
  280.        try { // bug 300911
  281.           if (i < reuseTabs.length) {
  282.              aTab = reuseTabs[i];
  283.              let browser = gBrowser.getBrowserForTab(aTab);
  284.              browser.userTypedValue = bmGroup[i];
  285.              browser.loadURI(bmGroup[i]);
  286.              // setTabTitle will call tabBarScrollStatus for us
  287.              aTab.collapsed = false;
  288.              // reset visited & flst_id attribute
  289.              if (aTab != gBrowser.mCurrentTab) {
  290.                 aTab.removeAttribute("visited");
  291.                 aTab.removeAttribute("flst_id");
  292.              } else
  293.                 aTab.setAttribute("reloadcurrent", true);
  294.           }
  295.           else
  296.              aTab = gBrowser.addTab(bmGroup[i]);
  297.           if (bmIds[i] && bmIds[i] > -1)
  298.              aTab.setAttribute("tabmix_bookmarkId", bmIds[i]);
  299.        } catch (er) {
  300.        }
  301.  
  302.        if (!tabToSelect)
  303.           tabToSelect = aTab;
  304.        // move tab to place
  305.        index = prevTab._tPos + 1;
  306.        tabPos = aTab._tPos < index ? index - 1 : index;
  307.        gBrowser.TMmoveTabTo(aTab, tabPos);
  308.        prevTab = aTab;
  309.     }
  310.     tabBar.nextTab = 1;
  311.  
  312.     // focus the first tab if prefs say to
  313.     if (!loadInBackground || doReplace &&
  314.                              (gBrowser.selectedTab.hasAttribute("reloadcurrent") || 
  315.                               gBrowser.selectedTab in removeTabs)) {
  316.       var old = gBrowser.selectedTab;
  317.       gBrowser.selectedTab = tabToSelect;
  318.       if (old != tabToSelect)
  319.         tabToSelect.owner = old;
  320.       var reloadCurrent = old.hasAttribute("reloadcurrent");
  321.       if (reloadCurrent)
  322.         old.removeAttribute("reloadcurrent");
  323.       if (reloadCurrent && old != tabToSelect) {
  324.         old.removeAttribute("visited");
  325.         old.removeAttribute("flst_id");
  326.       }
  327.     }
  328.  
  329.     // and focus the content
  330.     content.focus();
  331.  
  332.     // Close any remaining open tabs or blank tabs that are left over.
  333.     while (removeTabs.length > 0) {
  334.        gBrowser.removeTab(removeTabs.pop());
  335.     }
  336.  
  337.   },
  338.  
  339.    getBookmarkTitle: function TMP_PC_getBookmarkTitle(aUrl, aItemId) {
  340.       try {
  341.          if (aItemId && aItemId > -1) {
  342.            var _URI = PlacesUtils.bookmarks.getBookmarkURI(aItemId);
  343.            if (_URI && _URI.spec == aUrl)
  344.              return PlacesUtils.bookmarks.getItemTitle(aItemId);
  345.          }
  346.          aItemId = PlacesUtils.getMostRecentBookmarkForURI(gIOService.newURI(aUrl, null, null));
  347.          return aItemId > -1 ? PlacesUtils.bookmarks.getItemTitle(aItemId): null;
  348.       } catch (ex) {
  349.         TMP_ASSERT(ex);
  350.       }
  351.       return null;
  352.    },
  353.  
  354.    // start showAddBookmarkUI with user defined title if exist
  355.    getTabFixedTitle: function TMP_PC_getTabFixedTitle(aBrowser, aURI) {
  356.       if (gBrowser == aBrowser)
  357.          aBrowser = gBrowser.selectedBrowser;
  358.  
  359.       var aTab = gBrowser.getTabForBrowser(aBrowser);
  360.       var fixedLabelUri = aTab.getAttribute("label-uri");
  361.       if (fixedLabelUri && (fixedLabelUri == aURI.spec || fixedLabelUri == "*"))
  362.          return aTab.getAttribute("fixed-label");
  363.  
  364.       return null;
  365.    }
  366.  
  367. }
  368.  
  369. function getTitleFromBookmark(aUrl, aTitle, aItemId) {
  370.    if (!gTabmixPrefs.getBoolPref("extensions.tabmix.titlefrombookmark") || !aUrl)
  371.       return aTitle;
  372.    var title = TMP_Places.getBookmarkTitle(aUrl, aItemId);
  373.    var ieTab = "gIeTab" in window;
  374.    if (title || !ieTab)
  375.       return title || aTitle;
  376.  
  377.    // IE Tab is installed try to find url with or without the prefix
  378.    var ietab = "chrome://ietab/content/reloaded.html?url="
  379.    if (aUrl == ietab)
  380.       return aTitle;
  381.    if (aUrl.indexOf(ietab) == 0)
  382.       title = TMP_Places.getBookmarkTitle(aUrl.replace(ietab, ""), aItemId);
  383.    else
  384.       title = TMP_Places.getBookmarkTitle(ietab + aUrl, aItemId);
  385.  
  386.    return title || aTitle;
  387. }
  388.  
  389. // if we don't have any browser window open return false so we can open new window
  390. function getSingleWindowMode() {
  391.   var w = getTopWin();
  392.   if (!w)
  393.     return false;
  394.   return w.gTabmixPrefs.getBoolPref("extensions.tabmix.singleWindow", false);
  395. }
  396.  
  397. // update context menu for bookmarks manager and sidebar
  398. // for bookmarks/places, history, sage and more.....
  399. function TMP_updateContextMenu(open, openInWindow, openInTab, pref) {
  400.   // if all 3 was hidden ... probably "Open all in Tabs" is visible
  401.   if (open.hidden && openInWindow.hidden && openInTab.hidden)
  402.     return;
  403.  
  404.   var w = getTopWin();
  405.   if (w) {
  406.     var where = w.TMP_whereToOpen(pref);
  407.  
  408.     if (!openInWindow.hidden && w.gSingleWindowMode)
  409.       openInWindow.hidden = true;
  410.     else if (openInWindow.hasAttribute("default"))
  411.       openInWindow.removeAttribute("default");
  412.  
  413.     TMP_setItem(openInTab, "default", where.inNew ? "true" : null);
  414.  
  415.     if (open.hidden != where.lock)
  416.       open.hidden = where.lock;
  417.     if (!open.hidden)
  418.       TMP_setItem(open, "default", !where.inNew ? "true" : null);
  419.   }
  420.   else {
  421.     open.hidden = true;
  422.     openInTab.hidden = true;
  423.     openInWindow.hidden = false;
  424.     openInWindow.setAttribute("default", true);
  425.   }
  426. }
  427.  
  428.  
  429. // Show/hide one item (specified via name or the item element itself).
  430. function TMP_showItem (aItemOrId, aShow) {
  431.   var item = typeof(aItemOrId) == "string" ? document.getElementById(aItemOrId) : aItemOrId;
  432.   if (item)
  433.     item.hidden = !aShow;
  434. }
  435.  
  436. function TMP_setItem(aItemOrId, aAttr, aVal) {
  437.   var elem = typeof(aItemOrId) == "string" ? document.getElementById(aItemOrId) : aItemOrId;
  438.   if (elem) {
  439.     if (aVal == null) {
  440.       elem.removeAttribute(aAttr);
  441.       return;
  442.     }
  443.     if (typeof(aVal) == "boolean")
  444.       aVal = aVal ? "true" : "false";
  445.  
  446.     if (elem.getAttribute(aAttr) != aVal)
  447.       elem.setAttribute(aAttr, aVal);
  448.   }
  449. }
  450.  
  451. /* DEPRECATED */
  452. const TMP_D_MSG = "This function was DEPRECATED in TabMix since version 0.3.8.2pre.090822";
  453. var TMP_Bookmark = {
  454.   // TreeStyleTab eval TMP_Bookmark.openGroup function so we keep it here
  455.   openGroup: function TMP_BM_openGroup(bmGroup, bmIds, aWhere) { },
  456.   buildContextMenu: function () { tmLog(TMP_D_MSG, true); },
  457.   TMP_openGroupBookmark: function () { tmLog(TMP_D_MSG, true); },
  458.   _getBookmarkTitle: function () { tmLog(TMP_D_MSG, true); }
  459. }
  460. function isBookmarkletTM() { tmLog(TMP_D_MSG, true); }
  461. function openInWebPanelTM() { tmLog(TMP_D_MSG, true); }
  462. function whereToOpenLinkTabmix() { tmLog(TMP_D_MSG, true); }
  463. function TMP_update_whereToOpen() { tmLog(TMP_D_MSG, true); }
  464.